from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings


class FastDFSStorage(Storage):
    """自定义Django的文件存储系统"""


    def __init__(self, client_path=None, base_url=None):
        """
        初始化文件存储对象的构造方法
        :param self:
        :param client_conf: client.conf的文件绝对路径
        :param base_url: 下载文件的域名(ip:端口)
        :return:
        """
        # if client_conf == None:
        #     self.client = settings.FDFS_CLIENT_CONF
        # self.client=client_conf
        # 如果client_conf参数为none,就读取or后面的值

        self.client_path = client_path or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_BASE_URL


    def _open(self, name, mode='rb'):
        """
        存储类用于打开文件:因为必须实现,但是此处是文件存储不需要打开文件,所以重写之后什么也不做pass

        :param self:
        :param name: 要打开文件的名字
        :param mode: 打开模式:read bytes
        :return: None
        """
        pass


    def _save(self, name, content):
        """
        实现文件存储,在这个文件里面将文件转存到fastDFS服务器
        :param self:
        :param name: 要存储的文件名
        :param content: 要存储的对象,file类型的对象,将来使用content.read()读取对象中的文件二进制
        :return: file_id

        """
        # 创建对接fastDFS的客户端对象
        # client=Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
        # client=Fdfs_client(settings.FDFS_CLIENT_CONF)

        client = Fdfs_client(self.client_path)
        # 将头发转存到fdfs
        # ret=client.upload_appender_by_filename('/home/python/Desktop/1.jpg')
        ret = client.upload_by_buffer(content.read())
        # 判断文件是否上传成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('Upload file failed')
        # 获取file_id
        file_id = ret.get('Remote file_id')
        # 返回file_id
        return file_id


    def exists(self, name):
        """
        当要进行上传时都调用
        :param self:
        :param name: 要上传的文件名
        :return: True (表示文件已存在,不需要上传) False(文件不存在,需要上传)
        """
        return False


    def url(self, name):
        """
        当要访问图片时,就会调用此方法获取图片文件的绝对路径
        :param self:
        :param name: 要访问图片的file_id
        :return: 完整的图片访问路径
        """
        # FastDFS
        # FDFS_BASE_URL = 'http://192.168.209.2:8888/'
        # FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastdfs/client.conf')
        # return settings.FDFS_BASE_URL + name
        return self.base_url + name
